/*
 * for
 * for与区间
 * `for in`结构可以遍历一个`Iterator`(迭代器)。创建迭代器的一个最简单的方法是使用区间标记 `a..b`
 * 这会生成从`a`(包含)到`b`(不包含)的，步长为1的一系列值。
 *
 * for与迭代器
 * `for in`结构能以几种方式与`Iterator`互动
 * - iter
 * - into_iter
 * - iter_mut
 * 这三个函数会以不同的方式返回集合中的数据
 * 注意 `match` 的分支中所写的类型不同，这是不同迭代方式的关键区别。
 */
fn main() {
    // `n`将在每次迭代中分别取1、2、... 100
    println!("## 1..101");
    for n in 1..101 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        }
    }

    // 或者，可以使用 `a..=b`表示两端都包含在内的范围
    println!("## 1..=100");
    for n in 1..=100 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        }
    }

    // `iter` 在每次迭代中借用集合中的一个元素。这样集合本身不会被改变，循环之后仍可以使用
    println!("## iter");
    let names = vec!["Bob", "Frank"];
    for name in names.iter() {
        match name {
            &"Frank" => println!("frank out"),
            _ => println!("Hello {}", name),
        }
    }

    // `into_iter` 会消耗集合。在每次迭代中，集合中的数据本身会被提供。一旦集合被消耗了，
    // 之后就无法再使用了，因为它已经在循环中被"移除"(move) 了
    println!("## into_iter");
    let names = vec!["Bob", "Frank"];
    for name in names.into_iter() {
        match name {
            "Frank" => println!("frank out"),
            _ => println!("Hello {}", name),
        }
    }
    // 无法再使用 names
    //println!("names: {:?}", names);

    // `iter_mut` 可变地(mutably) 借用集合中的每个元素，从而允许集合被就地修改
    println!("## iter_mut");
    let mut names = vec!["Bob", "Frank"];
    for name in names.iter_mut() {
        *name = match name {
            &mut "Frank" => "Frank OO",
            _ => "Hello",
        }
    }
    println!("names: {:?}", names);

}